package uiMain;

import gestorbienraizok.contratos.Arrendamiento;
import gestorbienraizok.contratos.Compraventa;
import gestorbienraizok.inmuebles.Inmueble;
import static gestorbienraizok.inmuebles.Inmueble.buscarInmueble;
import gestorbienraizok.usuarios.ClienteDemandador;
import gestorbienraizok.usuarios.ClienteOferente;
import gestorbienraizok.usuarios.Funcionario;
import gestorbienraizok.usuarios.Persona;
import java.util.Scanner;
import static uiMain.bienRaizOk.*;

public class OpcionRegistrarNegocio extends OpcionDeMenu {

    private String nombreParaMostrar = " Registrar un negocio";

    @Override
    public void ejecutar() {
        Funcionario llamador = (Funcionario) usuarioActual;
        ClienteOferente esteClienteOferente = null;
        ClienteDemandador esteClienteDemandador = null;
        Inmueble esteInmueble = null;
        String codigoDelInmueble = null;

        boolean esCompraventa = verificarCaracteristica("Qué tipo de contrato desea registrar? Compraventa (1) o arrendamiento (2): ", "1", "2");

        do {
            System.out.print("Ingrese la cédula del cliente demandante: ");
            entrada = new Scanner(System.in);
            Long cedulaDelDemandante = entrada.nextLong();
            Persona estaPersona = Persona.buscarPersona(cedulaDelDemandante);

            if (estaPersona != null) {
                if (estaPersona instanceof ClienteDemandador) {
                    esteClienteDemandador = (ClienteDemandador) estaPersona;
                    if(!esteClienteDemandador.getFuncionario().equals(llamador)){
                        System.out.println("El cliente " + esteClienteDemandador.getNombre() + " es asesorado por " + esteClienteDemandador.getFuncionario().getNombre() + ", no por usted.");
                        esteClienteDemandador = null;
                    }
                } else {
                    System.out.println("Esta persona está registrada pero NO es un cliente demandador.");
                }
            } else {
                System.out.println("No se encontró a ningun usuario con cédula " + cedulaDelDemandante);
            }
        } while (esteClienteDemandador == null);

        do {
            System.out.print("Ingrese el código del inmueble: ");
            entrada = new Scanner(System.in);
            codigoDelInmueble = entrada.nextLine();

            esteInmueble = buscarInmueble(codigoDelInmueble);

            if (esteInmueble == null) {
                System.out.println("No se encontró ningún inmueble con el código " + codigoDelInmueble.toUpperCase());
            } else {
                esteClienteOferente = esteInmueble.getPropietario();
                if (esCompraventa) {
                    if (esteInmueble.getRol().contains("Venta")) {
                        if (!(esteInmueble.getDisponibilidad().equals("Disponible"))) {
                            System.out.println("Esta propiedad no está disponible para la venta, ya fue " + esteInmueble.getDisponibilidad().toLowerCase());
                            esteInmueble = null;
                        }

                    } else {
                        System.out.println("Esta propiedad no está disponible para la venta.");
                        esteInmueble = null;
                    }

                } else {
                    if (esteInmueble.getRol().toLowerCase().contains("alquiler")) {
                        if (!(esteInmueble.getDisponibilidad().equals("Disponible"))) {
                            System.out.println("Esta propiedad no está disponible para alquiler. Ya fue " + esteInmueble.getDisponibilidad().toLowerCase());
                            esteInmueble = null;
                        }
                    } else {
                        System.out.println("Esta propiedad no está disponible para alquiler.");
                        esteInmueble = null;
                    }
                }
            }
        } while (esteInmueble == null);

        if (esCompraventa) {
            System.out.print("El valor actual de esta propiedad es de " + formatearPrecio(esteInmueble.getPrecioDeVenta()) + ". ");
            boolean seCambiaElPrecio = verificarCaracteristica("¿Desea cambiar el valor? (S/N): ", "s", "n");
            float valorDeNegocio = esteInmueble.getPrecioDeVenta();

            if (seCambiaElPrecio) {
                System.out.print("Ingrese el nuevo valor: $");
                entrada = new Scanner(System.in);
                valorDeNegocio = entrada.nextLong();
            }

            System.out.println("Por favor verifique la información:");
            System.out.println("Inmueble:         " + codigoDelInmueble.toUpperCase());
            System.out.println("Vendedor:         " + esteClienteOferente.getNombre());
            System.out.println("Comprador:        " + esteClienteDemandador.getNombre());
            System.out.println("Precio de venta:  " + formatearPrecio(valorDeNegocio) + "\n");

            boolean esCorrecto = verificarCaracteristica("¿Es correcta la información del contrato? (S/N): ", "s", "n");

            if (esCorrecto) {
                Compraventa nuevaCompraventa = new Compraventa(valorDeNegocio, esteClienteDemandador, esteClienteOferente, esteInmueble);
                esteClienteDemandador.getListaDeContratos().add(nuevaCompraventa);
                esteInmueble.asignarContrato(nuevaCompraventa);
                esteInmueble.setDisponibilidad((byte) 1);
                System.out.println("Se ha creado con éxito el contrato #" + String.format("%3d",esteClienteDemandador.getListaDeContratos().getLast().getCodigo()).replace(" ", "0"));
            } else {
                return;
            }

        } else {
            System.out.print("La tarifa actual de esta propiedad es de " + formatearPrecio(esteInmueble.getTarifaDeArrendamiento()) + ". ");
            boolean seCambiaElPrecio = verificarCaracteristica("¿Desea cambiar el valor? (S/N): ", "s", "n");
            float valorDeNegocio = esteInmueble.getTarifaDeArrendamiento();

            if (seCambiaElPrecio) {
                System.out.print("Ingrese la nueva tarifa mensual: $");
                entrada = new Scanner(System.in);
                valorDeNegocio = entrada.nextLong();
            }

            System.out.println("Por favor verifique la información:");
            System.out.println("Inmueble:        " + codigoDelInmueble.toUpperCase());
            System.out.println("Propietario:     " + esteClienteOferente.getNombre());
            System.out.println("Arrendador:      " + esteClienteDemandador.getNombre());
            System.out.println("Tarifa mensual:  " + formatearPrecio(valorDeNegocio) + "\n");

            boolean esCorrecto = verificarCaracteristica("Es correcta la información del contrato? (S/N): ", "s", "n");

            if (esCorrecto) {
                Arrendamiento nuevoArrendamiento = new Arrendamiento(valorDeNegocio, esteClienteDemandador, esteClienteOferente, esteInmueble);
                esteClienteDemandador.getListaDeContratos().add(nuevoArrendamiento);
                esteInmueble.asignarContrato(nuevoArrendamiento);
                esteInmueble.setDisponibilidad((byte) 2);
                System.out.println("Se ha creado con éxito el contrato #" + String.format("%3d",esteClienteDemandador.getListaDeContratos().getLast().getCodigo()).replace(" ", "0"));
            } else {
                return;
            }
        }

        esteClienteDemandador.setTieneContratos();
        esteClienteOferente.setTieneContratos();
    }

    @Override
    public String toString() {
        return nombreParaMostrar;
    }
    
    @Override
    public String toStringParaMostrarElNivel() {
        return nombreParaMostrar.trim().concat("...................................................................").substring(0,67) + "Funcionarios";
    }
}
